{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "8e4b5fda-2a90-42a1-9f15-694996afc249",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "device(type='cuda')"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import torch\n",
    "from torchvision import transforms, datasets\n",
    "from torch.utils.data import DataLoader\n",
    "import matplotlib.pyplot as plt\n",
    "#隐藏警告\n",
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\")               #忽略警告信息\n",
    "plt.rcParams['font.sans-serif']    = ['SimHei'] # 用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False      # 用来正常显示负号\n",
    "plt.rcParams['figure.dpi']         = 100        #分辨率\n",
    "\n",
    "\n",
    "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "device"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "88a073ad-8a8d-48a4-aaff-7da6fc14aa7a",
   "metadata": {},
   "source": [
    "### 读取（下载）MNIST数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "3da3dca4-4896-488e-8937-b20a5ebeb8ae",
   "metadata": {},
   "outputs": [],
   "source": [
    "transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])\n",
    "\n",
    "train_dataset = datasets.MNIST(root='../datasets/mnist', train=True, download=True, transform=transform)  # download=True:如果没有下载数据集\n",
    "test_dataset = datasets.MNIST(root='../datasets/mnist', train=False, download=True, transform=transform)  # train=True训练集，=False测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "399f0f60-cf5f-4486-95d9-dc5f30b85694",
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 32\n",
    "\n",
    "train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)\n",
    "test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "464a6a21-9f4e-4752-9a51-77661ec1c6bd",
   "metadata": {},
   "source": [
    "### 展示MNIST数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "1852a06a-0e86-4324-9ba8-a8bf830f5a97",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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176aOXOmyqdOnfLj6FCU559/PtBD8Bt7PUqbL+toIfTY61V279692M9dsWKFynv37vXHkIIKV9YAAAAcRrEGAADgMIo1AAAAh9GzJvnvp3f77ber3K5dO5XtHjVb3vvriYisX7++FKODawJ5L1C778PuSRs4cKDKdq/HbbfdVibjAoqS937MCD+rV69WuXr16oU+Pu8agCkpKWUxpKDClTUAAACHUawBAAA4jGINAADAYWHTs9asWTOV77//fu92//791b7LL7/cp2NfuHBBZXvdLV/ueYbA83g8hea+ffuqPG7cuDIby4MPPqjyH/7wB5VjY2NVXrx4scpDhw4tm4EBgA9q1qypclG/F1955RXvNus/cmUNAADAaRRrAAAADqNYAwAAcFjI9KzZfWaDBg1SOW+PmohIgwYNSnyuLVu2qPzMM8+oHMh1uFB6xphCsz3XZs+erfKf//xnlb///nuVO3TooPKQIUO82wkJCWpfvXr1VD548KDK//znP1XO2+cBBJLd69m0aVOV866jhdCTmpqqckSEb9eGPvnkE38OJ+hxZQ0AAMBhFGsAAAAOo1gDAABwWND0rNWuXVvlFi1aqPzyyy+r3Lx58xKfa9OmTSpPnz5dZft+i6yjFl4iIyNVHj16tMr2/TezsrJUvuqqq4p9LrtvY+3atSo/8cQTxT4WUJ7sXk9fe5YQXOz7Fnft2lVl+/fkuXPnVJ4zZ47K//3vf/03uBDA3x4AAACHUawBAAA4jGINAADAYc70rNWoUUPl119/XWX78/BGjRqV6nx5e4Fmzpyp9tlrV/3www+lOheCy6effqry5s2bVW7Xrl2hz7fXYbP7LW1512F766231L6yvO8oUJ5uuOEGlRcsWBCYgaBMxMXFqVzUPba/+eYblR955BF/DymkcGUNAADAYRRrAAAADqNYAwAAcFi59axdf/31Kk+YMEHl9u3bq3zFFVeU6nynT59W2b5/47Rp07zbOTk5pToXQsuhQ4dU7t+/v8ojR45U+fHHH/fp+LNmzVL51Vdf9W5/+eWXPh0LcJV9b1AAJceVNQAAAIdRrAEAADiMYg0AAMBh5daz1q9fv0JzUT7//HOV33vvPZXPnz+vsr122okTJ3w6H/Czw4cPqzx58uRCMxCOVq1apfIdd9wRoJEgEPbs2aOyfV/jjh07ludwQg5X1gAAABxG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",
      "text/plain": [
       "<Figure size 640x480 with 12 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "for i in range(12):\n",
    "    plt.subplot(3, 4, i+1)\n",
    "    plt.tight_layout()\n",
    "    plt.imshow(train_dataset.data[i], cmap='gray', interpolation='none')\n",
    "    plt.title(\"Labels: {}\".format(train_dataset.train_labels[i]))\n",
    "    plt.xticks([])\n",
    "    plt.yticks([])\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9b33e30f-fd1b-4dfa-81fe-724ba3f05e4e",
   "metadata": {},
   "source": [
    "### 构建简单的CNN网络"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "2ed99698-d5e1-4135-8135-e7d07eec760a",
   "metadata": {},
   "outputs": [],
   "source": [
    "class Net(torch.nn.Module):\n",
    "    def __init__(self):\n",
    "        # （batch,1,28,28）\n",
    "        super(Net, self).__init__()\n",
    "        self.conv1 = torch.nn.Sequential(\n",
    "            torch.nn.Conv2d(1, 32, kernel_size=3), #（batch,32,26,26） 输入通道数1输出通道数32 32为小型任务的经验性选择，一般每层增加一倍欠拟合就加过拟合减\n",
    "            torch.nn.BatchNorm2d(32), # 对卷积层的输出进行批量归一化，使得每个特征图的分布更加稳定，从而加速训练并提高模型性能。\n",
    "            torch.nn.ReLU(),\n",
    "            torch.nn.MaxPool2d(kernel_size=2), #（batch,32,13,13）\n",
    "        )\n",
    "        self.conv2 = torch.nn.Sequential(\n",
    "            torch.nn.Conv2d(32, 64, kernel_size=3), #（batch,64,11,11）\n",
    "            torch.nn.BatchNorm2d(64),\n",
    "            torch.nn.ReLU(),\n",
    "            torch.nn.MaxPool2d(kernel_size=2), #（batch,64,5,5）\n",
    "        )\n",
    "        self.fc = torch.nn.Sequential(\n",
    "            torch.nn.Linear(1600, 50), # 1600 == 64*5*5\n",
    "            torch.nn.ReLU(),  # 添加ReLU激活函数 增加模型的非线性能力\n",
    "            torch.nn.Dropout(0.5), # 有效防止过拟合-丢弃率0.5          BN层和dropout层一起用效果不好（ 深层可能不好BN在后Dropout在前也不好\n",
    "            torch.nn.Linear(50, 10)\n",
    "        )\n",
    "\n",
    "    def forward(self, x):\n",
    "        batch_size = x.size(0)\n",
    "        x = self.conv1(x)  # 一层卷积层,一层池化层,一层激活层\n",
    "        x = self.conv2(x)  # 再来一次\n",
    "        x = x.view(batch_size, -1)  # flatten 变成全连接网络需要的输入\n",
    "        x = self.fc(x)\n",
    "        return x  # 最后输出的是维度为10的，也就是（对应数学符号的0~9）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "544b231c-4c23-4901-b6ec-907b6ee15154",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Net(\n",
      "  (conv1): Sequential(\n",
      "    (0): Conv2d(1, 32, kernel_size=(3, 3), stride=(1, 1))\n",
      "    (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    (2): ReLU()\n",
      "    (3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
      "  )\n",
      "  (conv2): Sequential(\n",
      "    (0): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1))\n",
      "    (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    (2): ReLU()\n",
      "    (3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
      "  )\n",
      "  (fc): Sequential(\n",
      "    (0): Linear(in_features=1600, out_features=50, bias=True)\n",
      "    (1): ReLU()\n",
      "    (2): Dropout(p=0.5, inplace=False)\n",
      "    (3): Linear(in_features=50, out_features=10, bias=True)\n",
      "  )\n",
      ")\n",
      "模型总参数数量: 99,568\n",
      "模型可训练参数数量: 99,568\n"
     ]
    }
   ],
   "source": [
    "model = Net().to(device)\n",
    "\n",
    "# 查看模型结构\n",
    "# 打印模型参数总数和可训练参数总数\n",
    "def count_parameters(model):\n",
    "    total_params = sum(p.numel() for p in model.parameters())  # 所有参数数量\n",
    "    trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad)  # 需要训练的参数数量\n",
    "    print(f\"模型总参数数量: {total_params:,}\")\n",
    "    print(f\"模型可训练参数数量: {trainable_params:,}\")\n",
    "\n",
    "print(model)\n",
    "count_parameters(model)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2d50bfb5-5df5-48eb-8bd1-5650444ba0a5",
   "metadata": {},
   "source": [
    "### 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "e9d593ea-7c20-4c5d-9fa3-aebb490a82cb",
   "metadata": {},
   "outputs": [],
   "source": [
    "loss_fn    = torch.nn.CrossEntropyLoss() # 交叉熵损失函数，常用在多分类任务中\n",
    "learn_rate = 0.01 # 学习率\n",
    "optimizer  = torch.optim.SGD(model.parameters(), lr=learn_rate, momentum = 0.9)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "652b2c9e-3b24-4d92-9784-08a4ac309ab5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 训练循环\n",
    "def train(dataloader, model, loss_fn, optimizer):\n",
    "    size = len(dataloader.dataset)  # 训练集的大小，一共60000张图片\n",
    "    num_batches = len(dataloader)   # 批次数目，1875（60000/32）\n",
    "\n",
    "    train_loss, train_acc = 0, 0  # 初始化训练损失和正确率\n",
    "    \n",
    "    for X, y in dataloader:  # 获取图片及其标签\n",
    "        X, y = X.to(device), y.to(device)\n",
    "        \n",
    "        # 计算预测误差\n",
    "        pred = model(X)          # 网络输出\n",
    "        loss = loss_fn(pred, y)  # 计算网络输出和真实值之间的差距，targets为真实值，计算二者差值即为损失\n",
    "        \n",
    "        # 反向传播\n",
    "        optimizer.zero_grad()  # grad属性归零\n",
    "        loss.backward()        # 反向传播\n",
    "        optimizer.step()       # 每一步自动更新\n",
    "        \n",
    "        # 记录acc与loss\n",
    "        train_acc  += (pred.argmax(1) == y).type(torch.float).sum().item()\n",
    "        train_loss += loss.item()\n",
    "            \n",
    "    train_acc  /= size\n",
    "    train_loss /= num_batches\n",
    "\n",
    "    return train_acc, train_loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "ea98c4e4-7374-47bc-9cee-eda0c4dd37d7",
   "metadata": {},
   "outputs": [],
   "source": [
    "def test(dataloader, model, loss_fn):\n",
    "    size        = len(dataloader.dataset)  # 测试集的大小，一共10000张图片\n",
    "    num_batches = len(dataloader)          # 批次数目，313（10000/32=312.5，向上取整）\n",
    "    test_loss, test_acc = 0, 0\n",
    "    \n",
    "    # 当不进行训练时，停止梯度更新，节省计算内存消耗\n",
    "    with torch.no_grad():\n",
    "        for imgs, target in dataloader:\n",
    "            imgs, target = imgs.to(device), target.to(device)\n",
    "            \n",
    "            # 计算loss\n",
    "            target_pred = model(imgs)\n",
    "            loss        = loss_fn(target_pred, target)\n",
    "            \n",
    "            test_loss += loss.item()\n",
    "            test_acc  += (target_pred.argmax(1) == target).type(torch.float).sum().item()\n",
    "\n",
    "    test_acc  /= size\n",
    "    test_loss /= num_batches\n",
    "\n",
    "    return test_acc, test_loss"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a5db3ed0-381d-4866-acc3-331dd671bf74",
   "metadata": {},
   "source": [
    "### 开始训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "1c635d45-0dfb-4d32-952e-5e36c6c74a2c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 1, Train_acc:87.2%, Train_loss:0.373, Test_acc:98.2%，Test_loss:0.063\n",
      "Epoch: 2, Train_acc:93.7%, Train_loss:0.190, Test_acc:98.7%，Test_loss:0.040\n",
      "Epoch: 3, Train_acc:95.2%, Train_loss:0.142, Test_acc:98.8%，Test_loss:0.036\n",
      "Epoch: 4, Train_acc:96.0%, Train_loss:0.122, Test_acc:98.8%，Test_loss:0.037\n",
      "Epoch: 5, Train_acc:96.3%, Train_loss:0.108, Test_acc:99.2%，Test_loss:0.027\n",
      "Epoch: 6, Train_acc:96.7%, Train_loss:0.097, Test_acc:99.1%，Test_loss:0.031\n",
      "Epoch: 7, Train_acc:96.9%, Train_loss:0.093, Test_acc:99.0%，Test_loss:0.030\n",
      "Epoch: 8, Train_acc:97.1%, Train_loss:0.085, Test_acc:99.0%，Test_loss:0.033\n",
      "Epoch: 9, Train_acc:97.5%, Train_loss:0.074, Test_acc:99.0%，Test_loss:0.034\n",
      "Epoch:10, Train_acc:97.5%, Train_loss:0.074, Test_acc:99.2%，Test_loss:0.029\n"
     ]
    }
   ],
   "source": [
    "epochs     = 10\n",
    "train_loss = []\n",
    "train_acc  = []\n",
    "test_loss  = []\n",
    "test_acc   = []\n",
    "\n",
    "for epoch in range(epochs):\n",
    "    model.train()\n",
    "    epoch_train_acc, epoch_train_loss = train(train_loader, model, loss_fn, optimizer)\n",
    "\n",
    "    model.eval()\n",
    "    epoch_test_acc, epoch_test_loss = test(test_loader, model, loss_fn)\n",
    "    \n",
    "    train_acc.append(epoch_train_acc)\n",
    "    train_loss.append(epoch_train_loss)\n",
    "    test_acc.append(epoch_test_acc)\n",
    "    test_loss.append(epoch_test_loss)\n",
    "\n",
    "    template = ('Epoch:{:2d}, Train_acc:{:.1f}%, Train_loss:{:.3f}, Test_acc:{:.1f}%，Test_loss:{:.3f}')\n",
    "    print(template.format(epoch+1, epoch_train_acc*100, epoch_train_loss, epoch_test_acc*100, epoch_test_loss))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "09cb0196-1a1c-41b3-b2d6-167d22c7143a",
   "metadata": {},
   "source": [
    "###  结果可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1f0a057c-bac1-4f9c-845f-4627d358f5d4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1200x300 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "epochs_range = range(epochs)\n",
    "\n",
    "plt.figure(figsize=(12, 3))\n",
    "plt.subplot(1, 2, 1)\n",
    "\n",
    "plt.plot(epochs_range, train_acc, label='Training Accuracy')\n",
    "plt.plot(epochs_range, test_acc, label='Test Accuracy')\n",
    "plt.legend(loc='lower right')\n",
    "plt.title('Training and Validation Accuracy')\n",
    "\n",
    "plt.subplot(1, 2, 2)\n",
    "plt.plot(epochs_range, train_loss, label='Training Loss')\n",
    "plt.plot(epochs_range, test_loss, label='Test Loss')\n",
    "plt.legend(loc='upper right')\n",
    "plt.title('Training and Validation Loss')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d4af9f02-3706-449b-8de0-0e5ec0cf2158",
   "metadata": {},
   "source": [
    "### 保存模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "bf4e70e3-e32e-4b7b-ad3e-28453f6c7f09",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 指定保存路径\n",
    "save_dir = '../models/1_Handwritten_Digit_Recognition'\n",
    "\n",
    "# 确保目录存在，如果不存在则创建\n",
    "import os\n",
    "if not os.path.exists(save_dir):\n",
    "    os.makedirs(save_dir)\n",
    "\n",
    "# 保存模型\n",
    "torch.save(model.state_dict(), os.path.join(save_dir, 'model_weights.pth'))\n",
    "\n",
    "# # 加载模型参数\n",
    "# model.load(torch.load(os.path.join(save_dir, 'model_weights.pth')))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.20"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
